/*!
 * \file WtDtHelper.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader数据助手工具头文件
 * 
 * \details 本文件定义了WonderTrader数据助手工具的C接口，提供数据文件处理功能：
 *          - 支持DSB/DMB格式的K线和Tick数据文件读取
 *          - 提供二进制数据文件与CSV文件的双向转换
 *          - 支持K线数据的重采样和周期转换
 *          - 提供数据文件的批量导出和导入功能
 *          - 支持自定义回调函数进行数据处理
 *          - 为Python等外部语言提供数据访问接口
 */
#pragma once

#include "../Includes/WTSTypes.h"

NS_WTP_BEGIN
struct WTSBarStruct;
struct WTSTickStruct;
struct WTSOrdDtlStruct;
struct WTSOrdQueStruct;
struct WTSTransStruct;
NS_WTP_END

USING_NS_WTP;

/*!
 * \brief 日志回调函数类型定义
 * \param message 日志消息内容
 * \details 用于接收数据处理过程中的日志信息
 */
typedef void(PORTER_FLAG *FuncLogCallback)(WtString message);

/*!
 * \brief K线数据获取回调函数类型定义
 * \param bar K线数据结构体指针
 * \param count 数据条数
 * \param isLast 是否为最后一批数据
 * \details 用于接收读取到的K线数据，支持分批处理大量数据
 */
typedef void(PORTER_FLAG *FuncGetBarsCallback)(WTSBarStruct* bar, WtUInt32 count, bool isLast);

/*!
 * \brief Tick数据获取回调函数类型定义
 * \param tick Tick数据结构体指针
 * \param count 数据条数
 * \param isLast 是否为最后一批数据
 * \details 用于接收读取到的Tick数据，支持分批处理大量数据
 */
typedef void(PORTER_FLAG *FuncGetTicksCallback)(WTSTickStruct* tick, WtUInt32 count, bool isLast);

/*!
 * \brief 数据计数回调函数类型定义
 * \param dataCnt 数据总条数
 * \details 用于接收数据文件中的总记录数信息
 */
typedef void(PORTER_FLAG *FuncCountDataCallback)(WtUInt32 dataCnt);

// 备用的直接从Python访问内存的方式（已注释）
//typedef bool(PORTER_FLAG *FuncGetBarItem)(WTSBarStruct* curBar,int idx);
//typedef bool(PORTER_FLAG *FuncGetTickItem)(WTSTickStruct* curTick, int idx);

#ifdef __cplusplus
extern "C"
{
#endif
	/*!
	 * \brief 导出K线数据为CSV格式
	 * \param binFolder 二进制数据文件目录
	 * \param csvFolder CSV输出目录
	 * \param strFilter 文件过滤器，默认为空（处理所有文件）
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \details 将指定目录下的DSB格式K线数据文件批量转换为CSV格式
	 */
	EXPORT_FLAG	void		dump_bars(WtString binFolder, WtString csvFolder, WtString strFilter = "", FuncLogCallback cbLogger = NULL);
	
	/*!
	 * \brief 导出Tick数据为CSV格式
	 * \param binFolder 二进制数据文件目录
	 * \param csvFolder CSV输出目录
	 * \param strFilter 文件过滤器，默认为空（处理所有文件）
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \details 将指定目录下的DSB格式Tick数据文件批量转换为CSV格式
	 */
	EXPORT_FLAG	void		dump_ticks(WtString binFolder, WtString csvFolder, WtString strFilter = "", FuncLogCallback cbLogger = NULL);
	
	/*!
	 * \brief 将CSV格式K线数据转换为二进制格式
	 * \param csvFolder CSV数据文件目录
	 * \param binFolder 二进制输出目录
	 * \param period K线周期（如"m1", "m5", "d1"等）
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \details 将CSV格式的K线数据文件转换为WonderTrader标准的DSB格式
	 */
	EXPORT_FLAG	void		trans_csv_bars(WtString csvFolder, WtString binFolder, WtString period, FuncLogCallback cbLogger = NULL);

	/*!
	 * \brief 读取DSB格式Tick数据文件
	 * \param tickFile Tick数据文件路径
	 * \param cb Tick数据回调函数
	 * \param cbCnt 数据计数回调函数
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 读取的数据条数
	 * \details 读取DSB格式的Tick数据文件，通过回调函数返回数据
	 */
	EXPORT_FLAG	WtUInt32	read_dsb_ticks(WtString tickFile, FuncGetTicksCallback cb, FuncCountDataCallback cbCnt, FuncLogCallback cbLogger = NULL);
	
	/*!
	 * \brief 读取DSB格式K线数据文件
	 * \param barFile K线数据文件路径
	 * \param cb K线数据回调函数
	 * \param cbCnt 数据计数回调函数
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 读取的数据条数
	 * \details 读取DSB格式的K线数据文件，通过回调函数返回数据
	 */
	EXPORT_FLAG	WtUInt32	read_dsb_bars(WtString barFile, FuncGetBarsCallback cb, FuncCountDataCallback cbCnt, FuncLogCallback cbLogger = NULL);

	/*!
	 * \brief 读取DMB格式Tick数据文件
	 * \param tickFile Tick数据文件路径
	 * \param cb Tick数据回调函数
	 * \param cbCnt 数据计数回调函数
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 读取的数据条数
	 * \details 读取DMB格式的Tick数据文件，通过回调函数返回数据
	 */
	EXPORT_FLAG	WtUInt32	read_dmb_ticks(WtString tickFile, FuncGetTicksCallback cb, FuncCountDataCallback cbCnt, FuncLogCallback cbLogger = NULL);
	
	/*!
	 * \brief 读取DMB格式K线数据文件
	 * \param barFile K线数据文件路径
	 * \param cb K线数据回调函数
	 * \param cbCnt 数据计数回调函数
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 读取的数据条数
	 * \details 读取DMB格式的K线数据文件，通过回调函数返回数据
	 */
	EXPORT_FLAG	WtUInt32	read_dmb_bars(WtString barFile, FuncGetBarsCallback cb, FuncCountDataCallback cbCnt, FuncLogCallback cbLogger = NULL);

	// 备用的直接数据传输接口（已注释）
	//EXPORT_FLAG bool		trans_bars(WtString barFile, FuncGetBarItem getter, int count, WtString period, FuncLogCallback cbLogger = NULL);
	//EXPORT_FLAG bool		trans_ticks(WtString tickFile, FuncGetTickItem getter, int count, FuncLogCallback cbLogger = NULL);

	/*!
	 * \brief 存储K线数据到文件
	 * \param barFile 输出文件路径
	 * \param firstBar K线数据数组首地址
	 * \param count 数据条数
	 * \param period K线周期
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 是否存储成功
	 * \details 将内存中的K线数据存储为DSB格式文件
	 */
	EXPORT_FLAG bool		store_bars(WtString barFile, WTSBarStruct* firstBar, int count, WtString period, FuncLogCallback cbLogger = NULL);
	
	/*!
	 * \brief 存储Tick数据到文件
	 * \param tickFile 输出文件路径
	 * \param firstTick Tick数据数组首地址
	 * \param count 数据条数
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 是否存储成功
	 * \details 将内存中的Tick数据存储为DSB格式文件
	 */
	EXPORT_FLAG bool		store_ticks(WtString tickFile, WTSTickStruct* firstTick, int count, FuncLogCallback cbLogger = NULL);

	/*!
	 * \brief K线数据重采样
	 * \param barFile K线数据文件路径
	 * \param cb K线数据回调函数
	 * \param cbCnt 数据计数回调函数
	 * \param fromTime 开始时间
	 * \param endTime 结束时间
	 * \param period 目标周期
	 * \param times 周期倍数
	 * \param sessInfo 交易时段信息
	 * \param cbLogger 日志回调函数，默认为NULL
	 * \return 重采样后的数据条数
	 * \details 将K线数据按指定周期和时间范围进行重采样处理
	 */
	EXPORT_FLAG WtUInt32	resample_bars(WtString barFile, FuncGetBarsCallback cb, FuncCountDataCallback cbCnt, WtUInt64 fromTime, WtUInt64 endTime, WtString period, WtUInt32 times, WtString sessInfo, FuncLogCallback cbLogger = NULL);
#ifdef __cplusplus
}
#endif